package org.dromara.common.core.utils.ip

import cn.hutool.core.net.NetUtil
import cn.hutool.http.HtmlUtil
import io.github.oshai.kotlinlogging.KotlinLogging
import org.dromara.common.core.utils.NetUtils.isIPv4
import org.dromara.common.core.utils.NetUtils.isIPv6
import org.dromara.common.core.utils.NetUtils.isInnerIPv6
import org.dromara.common.core.utils.StringUtils
import org.dromara.common.core.utils.ip.RegionUtils.getCityInfo

/**
 * 获取地址类
 *
 *@author LikeYouDo
 *@date 2025/1/5 22:55
 */
object AddressUtils {
    private val log = KotlinLogging.logger {}

    // 未知IP
    const val UNKNOWN_IP: String = "XX XX"
    // 内网地址
    const val LOCAL_ADDRESS: String = "内网IP"
    // 未知地址
    const val UNKNOWN_ADDRESS: String = "未知"

    @JvmStatic
    fun getRealAddressByIP(ip: String?): String {
        // 处理空串并过滤HTML标签
        val ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip, ""))
        // 判断是否为IPv4
        if (isIPv4(ip)) {
            return resolverIPv4Region(ip)
        }
        // 判断是否为IPv6
        if (isIPv6(ip)) {
            return resolverIPv6Region(ip)
        }
        // 如果不是IPv4或IPv6，则返回未知IP
        return UNKNOWN_IP
    }

    /**
     * 根据IPv4地址查询IP归属行政区域
     * @param ip ipv4地址
     * @return 归属行政区域
     */
    private fun resolverIPv4Region(ip: String): String {
        // 内网不查询
        if (NetUtil.isInnerIP(ip)) {
            return LOCAL_ADDRESS
        }
        return getCityInfo(ip)
    }

    /**
     * 根据IPv6地址查询IP归属行政区域
     * @param ip ipv6地址
     * @return 归属行政区域
     */
    private fun resolverIPv6Region(ip: String?): String {
        // 内网不查询
        if (isInnerIPv6(ip)) {
            return LOCAL_ADDRESS
        }
        log.warn { "ip2region不支持IPV6地址解析：${ip}" }
        // 不支持IPv6，不再进行没有必要的IP地址信息的解析，直接返回
        // 如有需要，可自行实现IPv6地址信息解析逻辑，并在这里返回
        return UNKNOWN_ADDRESS
    }

}
